﻿<script setup lang="ts" name="WebsocketTest">
import socket from '@/utils/websocket'
import { storeToRefs } from 'pinia'
import { useSystemConfigStore } from '@/store/storage/systemConfigStore'
const systemConfigStore = useSystemConfigStore()
const { systemConfig } = storeToRefs(systemConfigStore)
const route = useRoute()
// 获取当前页面的缓存状态是否被开启
const isKeepAlive = route.meta.keepAlive && systemConfig.value.isKeepAlive

const processTextList = ref([])
// 在组件挂载到页面后执行
onMounted(() => {
  // 未开启页面状态缓存的情况下，监听事件在此声明周期内开启
  if (!isKeepAlive) {
    processTextList.value.push('开始尝试进行websocket连接')
    // 启动websocket通信
    socket.connectWebsocket(
      // websocket连接地址
      '',
      // 传递给后台的数据
      {},
      // 成功拿到后台返回的数据的回调函数
      (data) => {
        console.log('成功接收数据：', data)
      },
      // websocket连接失败的回调函数
      (e) => {
        processTextList.value.push(e)
        console.log('websocket连接失败', e)
      }
    )
  }
})
// 页面未启用keep-alive时，则需要在此生命周期函数内（组件被卸载之前执行）移除监听
onBeforeUnmount(() => {
  // 未开启页面状态缓存的情况下，监听事件在此声明周期内移除
  if (!isKeepAlive) {
    // 关闭websocket通信
    socket.closeWebsocket()
  }
})

// keep-alive启用时，页面被激活时使用
onActivated(() => {
  // 开启页面状态缓存的情况下，监听事件在此声明周期内开启
  if (isKeepAlive) {
    processTextList.value.push('开始尝试进行websocket连接')
    // 启动websocket通信
    socket.connectWebsocket(
      // websocket连接地址
      '',
      // 传递给后台的数据
      {},
      // 成功拿到后台返回的数据的回调函数
      (data) => {
        processTextList.value.push('websocket连接成功')
        console.log('成功接收数据：', data)
      },
      // websocket连接失败的回调函数
      (e) => {
        processTextList.value.push(e)
        console.log(e)
      }
    )
  }
})
// 页面启用keep-alive时，则需要在此生命周期函数内（组件切换，老组件消失的时候执行）移除监听事件
onDeactivated(() => {
  // 开启页面状态缓存的情况下，监听事件在此声明周期内移除
  if (isKeepAlive) {
    // 关闭websocket通信
    socket.closeWebsocket()
  }
})
</script>
<template>
  <el-space :size="systemConfig.space" fill direction="vertical">
    <el-card shadow="never" class="no-border no-radius">
      <h2>websocket测试</h2>
      <p v-for="(item, index) in processTextList" :key="index">{{ item }}</p>
    </el-card>
  </el-space>
</template>

<style scoped lang="scss">
.el-space {
  width: 100%;
  padding: var(--el-space) var(--el-space) 0;
}

.no-border {
  border: none;
}

.no-radius {
  border-radius: 0;
}

h2 {
  font-weight: bold;
  font-size: 24px;
}

.el-card {
  display: flex;

  :deep(.el-card__body) {
    display: flex;
    flex: 1;
    flex-direction: column;
    align-items: center;
    justify-content: center;

    p {
      margin-top: 10px;
      text-align: center;
    }
  }
}
</style>
